0905. 按奇偶排序数组【简单】
1. 📝 题目描述
给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。
返回满足此条件的 任一数组 作为答案。
示例 1:
txt
输入:nums = [3,1,2,4]
输出:[2,4,3,1]
解释:[4,2,3,1]、[2,4,1,3] 和 [4,2,1,3] 也会被视作正确答案。1
2
3
2
3
示例 2:
txt
输入:nums = [0]
输出:[0]1
2
2
提示:
1 <= nums.length <= 50000 <= nums[i] <= 5000
2. 🎯 s.1 - 暴力解法
js
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortArrayByParity = function (nums) {
let left = 0
let right = nums.length - 1
while (left < right) {
// 如果左边是偶数,左指针右移
if (nums[left] % 2 === 0) {
left++
}
// 如果右边是奇数,右指针左移
else if (nums[right] % 2 === 1) {
right--
}
// 左边是奇数,右边是偶数,交换两者
else {
;[nums[left], nums[right]] = [nums[right], nums[left]]
left++
right--
}
}
return nums
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
js
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortArrayByParity = function (nums) {
let left = 0
let right = nums.length - 1
while (left < right) {
// 确保 left 指向奇数
while (left < right && nums[left] % 2 === 0) left++
// 确保 right 指向偶数
while (left < right && nums[right] % 2 === 1) right--
// 如果指针仍然有效,交换奇偶数
if (left < right) {
;[nums[left], nums[right]] = [nums[right], nums[left]]
left++
right--
}
}
return nums
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- 时间复杂度:
,其中 n 是数组长度,每个元素最多被访问一次 - 空间复杂度:
,只使用了常数级别的额外空间,原地修改数组
3. 🎯 s.2 - 新建数组,不破坏原数组
js
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortArrayByParity = function (nums) {
const result = []
// 先添加所有偶数
for (const num of nums) {
if (num % 2 === 0) {
result.push(num)
}
}
// 再添加所有奇数
for (const num of nums) {
if (num % 2 === 1) {
result.push(num)
}
}
return result
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23